{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "de01baa9",
   "metadata": {},
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    "from model.mpc_no_embed import MPCNoEmbedModel_2L\n",
    "from scikeras.wrappers import KerasClassifier\n",
    "from sklearn.model_selection import KFold\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "88e441a2",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "from keras.utils import np_utils\n",
    "# Oversample and plot imbalanced dataset with SMOTE\n",
    "from collections import Counter\n",
    "from imblearn.over_sampling import SMOTE"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2adbe533",
   "metadata": {},
   "source": [
    "### filename description\n",
    "1. The filename of the training data is named as lhs_k_sizenlhs.csv, where k in [1,10] is the number of random latin-hybercubic sampling index and nls in [5000:5000:50000] is the sampling density of grid. \n",
    "2. The filename of saved training is \"savemodel/lhs_k_sizenlhs.h5\"  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "75de3f09",
   "metadata": {},
   "outputs": [],
   "source": [
    "def getdata(k,nlhs):\n",
    "    filename = \"data/lhs_\"+str(k)+\"_size\"+str(nlhs)+\".csv\"\n",
    "    dataframe = pandas.read_csv(filename, header=None)\n",
    "    dataset = dataframe.values\n",
    "    X = dataset[:,0:6].astype(float)\n",
    "    Y = dataset[:,6]\n",
    "    counter = Counter(Y)\n",
    "    print(counter)\n",
    "    oversample = SMOTE(k_neighbors=3)\n",
    "    X, Y = oversample.fit_resample(X, Y)\n",
    "    counter = Counter(Y)\n",
    "    print(counter)\n",
    "    # encode class values as integers\n",
    "    encoder = LabelEncoder()\n",
    "    encoder.fit(Y)\n",
    "    encoded_Y = encoder.transform(Y)\n",
    "    # convert integers to dummy variables (i.e. one hot encoded)\n",
    "    dummy_y = np_utils.to_categorical(encoded_Y)\n",
    "    return X, dummy_y\n",
    "\n",
    "def savemodel(estimator,k,nlhs):\n",
    "    filename = \"savemodel/lhs_\"+str(k)+\"_size\"+str(nlhs)+\"_noembed.h5\"\n",
    "    estimator.model_.save_weights(filename)\n",
    "    pass\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9c349faf",
   "metadata": {},
   "source": [
    "### grid description"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "b434455d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[50000]\n",
      "[ 1  2  3  4  5  6  7  8  9 10]\n"
     ]
    }
   ],
   "source": [
    "nlhs_grid = [50000]\n",
    "k_grid = np.linspace(1,10,10,dtype=int)\n",
    "print(nlhs_grid)\n",
    "print(k_grid)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "ca754433",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAwgAAAKqCAYAAACepnlGAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAACi7klEQVR4nOzdeVxU9f7H8feAMCCbIoIIKiApLgm55pblkmZZlmUupXLVNq3MVruZWv2ixevV9lUz00oz066mKS5louKCpamVW26ooKyyCfP7Azw6Cio2Awy8no/H3MedM99z5ns+5+s3vvP5fs8xWSwWiwAAAABAklN5VwAAAABAxcEAAQAAAICBAQIAAAAAAwMEAAAAAAYGCAAAAAAMDBAAAAAAGBggAAAAADAwQAAAAABgYIAAAAAAwMAAAcA/9tlnn8lkMmn//v02O+b+/ftlMpn02Wef2eyYju7GG2/UjTfeWN7VAABUcgwQgApqz549evDBBxUWFiY3Nzd5e3urY8eOmjZtmrKyssq7ejYzZ84cTZ06tbyrYWXYsGEymUzy9vYuNtZ//vmnTCaTTCaTJk+eXOrjHzlyRBMnTlRCQoINanv1TCaTRo8eXexnZwd9mzZtstv3V5Q4AACsVSvvCgC42OLFi3XPPffIbDZryJAhat68uXJzc7V27Vo9/fTT2rFjhz766KPyrqZNzJkzR9u3b9eYMWOstjdo0EBZWVlycXEpl3pVq1ZNp0+f1vfff6/+/ftbfTZ79my5ubkpOzv7qo595MgRTZo0SSEhIYqKirri/X788cer+r6K6mrjAACwLwYIQAWzb98+DRgwQA0aNNDKlSsVGBhofDZq1Cj99ddfWrx48T/+HovFouzsbLm7u1/0WXZ2tlxdXeXkVH5JRpPJJDc3t3L7frPZrI4dO+rLL7+8aIAwZ84c3XrrrZo/f36Z1OX06dOqXr26XF1dy+T7AABVG1OMgArmjTfeUEZGhj799FOrwcFZ4eHhevzxx433Z86c0csvv6yGDRvKbDYrJCREzz//vHJycqz2CwkJ0W233aZly5apdevWcnd314cffqjVq1fLZDLpq6++0gsvvKCgoCBVr15daWlpkqQNGzaoV69e8vHxUfXq1dWlSxf98ssvlz2PhQsX6tZbb1XdunVlNpvVsGFDvfzyy8rPzzfK3HjjjVq8eLEOHDhgTNkJCQmRVPIahJUrV6pz587y8PBQjRo1dMcdd2jnzp1WZSZOnCiTyaS//vpLw4YNU40aNeTj46Po6GidPn36snU/a9CgQfrhhx+UkpJibIuPj9eff/6pQYMGXVT+5MmTeuqpp3TttdfK09NT3t7euuWWW7Rt2zajzOrVq9WmTRtJUnR0tHHeZ8/zxhtvVPPmzbV582bdcMMNql69up5//nnjs/PXIAwdOlRubm4XnX/Pnj1Vs2ZNHTly5IrP9Urt2rVLd999t3x9feXm5qbWrVtr0aJFdovDr7/+qi5duqh69eoKDw/XN998I0las2aN2rVrJ3d3dzVu3FgrVqywqsOBAwf0yCOPqHHjxnJ3d1etWrV0zz33XLRO5uxUqp9++kkPPvigatWqJW9vbw0ZMkSnTp2ycfQAwDGQQQAqmO+//15hYWHq0KHDFZUfMWKEZs6cqbvvvltPPvmkNmzYoJiYGO3cuVMLFiywKrt7924NHDhQDz74oEaOHKnGjRsbn7388stydXXVU089pZycHLm6umrlypW65ZZb1KpVK02YMEFOTk6aMWOGunbtqp9//llt27YtsV6fffaZPD09NXbsWHl6emrlypV68cUXlZaWpjfffFOS9O9//1upqak6dOiQ/vvf/0qSPD09SzzmihUrdMsttygsLEwTJ05UVlaW3n77bXXs2FFbtmwxBhdn9e/fX6GhoYqJidGWLVv0ySefyN/fX6+//voVxfauu+7SQw89pG+//Vb/+te/JBVmDyIiItSyZcuLyu/du1ffffed7rnnHoWGhurYsWP68MMP1aVLF/3++++qW7eumjRpopdeekkvvviiHnjgAXXu3FmSrK53cnKybrnlFg0YMED33XefAgICiq3ftGnTtHLlSg0dOlRxcXFydnbWhx9+qB9//FGzZs1S3bp1L3uO2dnZSkpKumh7RkbGRdt27Nihjh07KigoSM8995w8PDw0d+5c9e3bV/Pnz9edd95p0zicOnVKt912mwYMGKB77rlH77//vgYMGKDZs2drzJgxeuihhzRo0CC9+eabuvvuu3Xw4EF5eXlJKhzIrVu3TgMGDFBwcLD279+v999/XzfeeKN+//13Va9e3ercRo8erRo1amjixInavXu33n//fR04cMAYQANAlWIBUGGkpqZaJFnuuOOOKyqfkJBgkWQZMWKE1fan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phaKi4uVrlKlpKQgISEB5ubmcHR0VGFk6iE0NBRRUVHYt28fjIyMhL0zJiYm0NPTU3F0zV94eDgGDx4MR0dHFBUVISoqCidPnsThw4dVHZraMDIyemLPjIGBASwsLLiXpoF88sknGDJkCJycnPDo0SPMnTsXmpqaGD16tKpDUwszZ85E9+7d8e2332LEiBG4ePEi1qxZgzVr1qg6NCIBC4R6GjlyJLKzs/Hll18iMzMTnTt3RkxMzBMbl+nFxMbG4tVXXxW+DwsLAwCEhIRgw4YNKopKfURGRgIAXnnlFaX29evXY8KECS8/IDWTlZWF8ePHIyMjAyYmJvDy8sLhw4cxYMAAVYdG9NzS0tIwevRo5ObmwsrKCj179sT58+dhZWWl6tDUgr+/P6KjoxEeHo6vv/4aLi4uWLp0KYKDg1UdGpGAz0EgIiIiIiIB9yAQEREREZGABQIREREREQlYIBARERERkYAFAhERERERCVggEBERERGRgAUCEREREREJWCAQEREREZGABQIREREREQlYIBARERERkYAFAhERERERCVggEBERERGRgAUCEREREREJ/j+ZVT8iNr/tOgAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 1000x800 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "k = 1\n",
    "nlhs = 50000\n",
    "filename = \"data/lhs_\"+str(k)+\"_size\"+str(nlhs)+\".csv\"\n",
    "dataframe = pandas.read_csv(filename, header=None)\n",
    "\n",
    "dataframe.head()\n",
    "\n",
    "corr_matrix = dataframe.corr()\n",
    "\n",
    "# 设置绘图尺寸\n",
    "plt.figure(figsize=(10, 8))\n",
    "\n",
    "# 使用seaborn绘制热力图\n",
    "sns.heatmap(corr_matrix, annot=True, fmt=\".2f\", cmap='coolwarm', cbar=True)\n",
    "\n",
    "# 添加图形标题\n",
    "plt.title('Correlation Matrix Heatmap')\n",
    "\n",
    "# 显示图形\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2b4db6ae",
   "metadata": {},
   "source": [
    "### define the NN model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "4162c8dd",
   "metadata": {},
   "outputs": [],
   "source": [
    "def baseline_model(learning_rate=0.001):  # Add learning_rate parameter\n",
    "    model = MPCNoEmbedModel_2L(input_shape=6, num_classes=7)\n",
    "    # Compile model with specified learning rate\n",
    "    optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate)  # Specify learning rate here\n",
    "    model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])\n",
    "    return model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "86a6269a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Counter({2.0: 8456, 3.0: 8321, 6.0: 8321, 4.0: 8297, 5.0: 8293, 1.0: 8261, 7.0: 51})\n",
      "Counter({3.0: 8456, 5.0: 8456, 6.0: 8456, 1.0: 8456, 2.0: 8456, 4.0: 8456, 7.0: 8456})\n",
      "(59192, 6)\n",
      "(59192, 7)\n"
     ]
    }
   ],
   "source": [
    "k = 5\n",
    "nlhs = 50000\n",
    "X, dummy_y = getdata(k,nlhs)\n",
    "\n",
    "print(X.shape)\n",
    "print(dummy_y.shape)\n",
    "\n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "86220892",
   "metadata": {},
   "source": [
    "### For loop to store the training results regarding different k & nls"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "79a84781",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Counter({5.0: 8486, 3.0: 8409, 2.0: 8324, 6.0: 8274, 4.0: 8232, 1.0: 8217, 7.0: 58})\n",
      "Counter({6.0: 8486, 2.0: 8486, 4.0: 8486, 1.0: 8486, 3.0: 8486, 5.0: 8486, 7.0: 8486})\n",
      "train-score: 0.85\n",
      "test-score: 0.86\n",
      "train-score: 0.85\n",
      "test-score: 0.85\n",
      "train-score: 0.86\n",
      "test-score: 0.85\n",
      "train-score: 0.86\n",
      "test-score: 0.86\n",
      "train-score: 0.86\n",
      "test-score: 0.85\n",
      "Counter({5.0: 8514, 2.0: 8421, 6.0: 8382, 3.0: 8369, 4.0: 8159, 1.0: 8115, 7.0: 40})\n",
      "Counter({2.0: 8514, 6.0: 8514, 4.0: 8514, 5.0: 8514, 3.0: 8514, 1.0: 8514, 7.0: 8514})\n",
      "train-score: 0.85\n",
      "test-score: 0.85\n",
      "train-score: 0.22\n",
      "test-score: 0.21\n",
      "train-score: 0.85\n",
      "test-score: 0.86\n",
      "train-score: 0.85\n",
      "test-score: 0.86\n",
      "train-score: 0.86\n",
      "test-score: 0.85\n",
      "Counter({5.0: 8427, 2.0: 8395, 6.0: 8362, 3.0: 8293, 1.0: 8252, 4.0: 8225, 7.0: 46})\n",
      "Counter({3.0: 8427, 5.0: 8427, 2.0: 8427, 4.0: 8427, 6.0: 8427, 1.0: 8427, 7.0: 8427})\n",
      "train-score: 0.85\n",
      "test-score: 0.86\n"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[1;32m~\\AppData\\Local\\Temp\\ipykernel_37816\\3473853520.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m     29\u001b[0m             \u001b[0my_test\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mconvert_to_tensor\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0my_test\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     30\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 31\u001b[1;33m             \u001b[0mestimator_lst\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mX_train\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my_train\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     32\u001b[0m             \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"train-score: %.2f\"\u001b[0m \u001b[1;33m%\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mestimator_lst\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mscore\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mX_train\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my_train\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     33\u001b[0m             \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"test-score: %.2f\"\u001b[0m \u001b[1;33m%\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mestimator_lst\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mscore\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mX_test\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my_test\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32md:\\Users\\forla\\anaconda3\\envs\\tf2\\lib\\site-packages\\scikeras\\wrappers.py\u001b[0m in \u001b[0;36mfit\u001b[1;34m(self, X, y, sample_weight, **kwargs)\u001b[0m\n\u001b[0;32m   1492\u001b[0m             \u001b[0msample_weight\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m1\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0msample_weight\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mNone\u001b[0m \u001b[1;32melse\u001b[0m \u001b[0msample_weight\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1493\u001b[0m             \u001b[0msample_weight\u001b[0m \u001b[1;33m*=\u001b[0m \u001b[0mcompute_sample_weight\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mclass_weight\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mclass_weight\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1494\u001b[1;33m         \u001b[0msuper\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mX\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mX\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msample_weight\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0msample_weight\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   1495\u001b[0m         \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1496\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32md:\\Users\\forla\\anaconda3\\envs\\tf2\\lib\\site-packages\\scikeras\\wrappers.py\u001b[0m in \u001b[0;36mfit\u001b[1;34m(self, X, y, sample_weight, **kwargs)\u001b[0m\n\u001b[0;32m    760\u001b[0m         \u001b[0mkwargs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"initial_epoch\"\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"initial_epoch\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    761\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 762\u001b[1;33m         self._fit(\n\u001b[0m\u001b[0;32m    763\u001b[0m             \u001b[0mX\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mX\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    764\u001b[0m             \u001b[0my\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32md:\\Users\\forla\\anaconda3\\envs\\tf2\\lib\\site-packages\\scikeras\\wrappers.py\u001b[0m in \u001b[0;36m_fit\u001b[1;34m(self, X, y, sample_weight, warm_start, epochs, initial_epoch, **kwargs)\u001b[0m\n\u001b[0;32m    929\u001b[0m         \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_check_model_compatibility\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    930\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 931\u001b[1;33m         self._fit_keras_model(\n\u001b[0m\u001b[0;32m    932\u001b[0m             \u001b[0mX\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    933\u001b[0m             \u001b[0my\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32md:\\Users\\forla\\anaconda3\\envs\\tf2\\lib\\site-packages\\scikeras\\wrappers.py\u001b[0m in \u001b[0;36m_fit_keras_model\u001b[1;34m(self, X, y, sample_weight, warm_start, epochs, initial_epoch, **kwargs)\u001b[0m\n\u001b[0;32m    524\u001b[0m                 \u001b[0mhist\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmodel_\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mX\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mfit_args\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    525\u001b[0m         \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 526\u001b[1;33m             \u001b[0mhist\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmodel_\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mX\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mfit_args\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    527\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    528\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mwarm_start\u001b[0m \u001b[1;32mor\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"history_\"\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mor\u001b[0m \u001b[0minitial_epoch\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32md:\\Users\\forla\\anaconda3\\envs\\tf2\\lib\\site-packages\\keras\\utils\\traceback_utils.py\u001b[0m in \u001b[0;36merror_handler\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m     62\u001b[0m     \u001b[0mfiltered_tb\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     63\u001b[0m     \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 64\u001b[1;33m       \u001b[1;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     65\u001b[0m     \u001b[1;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[1;33m:\u001b[0m  \u001b[1;31m# pylint: disable=broad-except\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     66\u001b[0m       \u001b[0mfiltered_tb\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m_process_traceback_frames\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0me\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__traceback__\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32md:\\Users\\forla\\anaconda3\\envs\\tf2\\lib\\site-packages\\keras\\engine\\training.py\u001b[0m in \u001b[0;36mfit\u001b[1;34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq, max_queue_size, workers, use_multiprocessing)\u001b[0m\n\u001b[0;32m   1250\u001b[0m                 \u001b[0mmodel\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1251\u001b[0m                 steps_per_execution=self._steps_per_execution)\n\u001b[1;32m-> 1252\u001b[1;33m           val_logs = self.evaluate(\n\u001b[0m\u001b[0;32m   1253\u001b[0m               \u001b[0mx\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mval_x\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1254\u001b[0m               \u001b[0my\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mval_y\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32md:\\Users\\forla\\anaconda3\\envs\\tf2\\lib\\site-packages\\keras\\utils\\traceback_utils.py\u001b[0m in \u001b[0;36merror_handler\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m     62\u001b[0m     \u001b[0mfiltered_tb\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     63\u001b[0m     \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 64\u001b[1;33m       \u001b[1;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     65\u001b[0m     \u001b[1;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[1;33m:\u001b[0m  \u001b[1;31m# pylint: disable=broad-except\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     66\u001b[0m       \u001b[0mfiltered_tb\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m_process_traceback_frames\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0me\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__traceback__\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32md:\\Users\\forla\\anaconda3\\envs\\tf2\\lib\\site-packages\\keras\\engine\\training.py\u001b[0m in \u001b[0;36mevaluate\u001b[1;34m(self, x, y, batch_size, verbose, sample_weight, steps, callbacks, max_queue_size, workers, use_multiprocessing, return_dict, **kwargs)\u001b[0m\n\u001b[0;32m   1541\u001b[0m               \u001b[0mend_step\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mstep\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0mdata_handler\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstep_increment\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1542\u001b[0m               \u001b[0mcallbacks\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mon_test_batch_end\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mend_step\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlogs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1543\u001b[1;33m       \u001b[0mlogs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtf_utils\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msync_to_numpy_or_python_type\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlogs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   1544\u001b[0m       \u001b[0mcallbacks\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mon_test_end\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlogs\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mlogs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1545\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32md:\\Users\\forla\\anaconda3\\envs\\tf2\\lib\\site-packages\\keras\\utils\\tf_utils.py\u001b[0m in \u001b[0;36msync_to_numpy_or_python_type\u001b[1;34m(tensors)\u001b[0m\n\u001b[0;32m    552\u001b[0m     \u001b[1;32mreturn\u001b[0m \u001b[0mt\u001b[0m  \u001b[1;31m# Don't turn ragged or sparse tensors to NumPy.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    553\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 554\u001b[1;33m   \u001b[1;32mreturn\u001b[0m \u001b[0mtf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mnest\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmap_structure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0m_to_single_numpy_or_python_type\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtensors\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    555\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    556\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32md:\\Users\\forla\\anaconda3\\envs\\tf2\\lib\\site-packages\\tensorflow\\python\\util\\nest.py\u001b[0m in \u001b[0;36mmap_structure\u001b[1;34m(func, *structure, **kwargs)\u001b[0m\n\u001b[0;32m    867\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    868\u001b[0m   return pack_sequence_as(\n\u001b[1;32m--> 869\u001b[1;33m       \u001b[0mstructure\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m[\u001b[0m\u001b[0mfunc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mentries\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    870\u001b[0m       expand_composites=expand_composites)\n\u001b[0;32m    871\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32md:\\Users\\forla\\anaconda3\\envs\\tf2\\lib\\site-packages\\tensorflow\\python\\util\\nest.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[1;34m(.0)\u001b[0m\n\u001b[0;32m    867\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    868\u001b[0m   return pack_sequence_as(\n\u001b[1;32m--> 869\u001b[1;33m       \u001b[0mstructure\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m[\u001b[0m\u001b[0mfunc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mentries\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    870\u001b[0m       expand_composites=expand_composites)\n\u001b[0;32m    871\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32md:\\Users\\forla\\anaconda3\\envs\\tf2\\lib\\site-packages\\keras\\utils\\tf_utils.py\u001b[0m in \u001b[0;36m_to_single_numpy_or_python_type\u001b[1;34m(t)\u001b[0m\n\u001b[0;32m    548\u001b[0m   \u001b[1;32mdef\u001b[0m \u001b[0m_to_single_numpy_or_python_type\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mt\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    549\u001b[0m     \u001b[1;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mt\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mTensor\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 550\u001b[1;33m       \u001b[0mx\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mnumpy\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    551\u001b[0m       \u001b[1;32mreturn\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mndim\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;36m0\u001b[0m \u001b[1;32melse\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    552\u001b[0m     \u001b[1;32mreturn\u001b[0m \u001b[0mt\u001b[0m  \u001b[1;31m# Don't turn ragged or sparse tensors to NumPy.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32md:\\Users\\forla\\anaconda3\\envs\\tf2\\lib\\site-packages\\tensorflow\\python\\framework\\ops.py\u001b[0m in \u001b[0;36mnumpy\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m   1147\u001b[0m     \"\"\"\n\u001b[0;32m   1148\u001b[0m     \u001b[1;31m# TODO(slebedev): Consider avoiding a copy for non-CPU or remote tensors.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1149\u001b[1;33m     \u001b[0mmaybe_arr\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_numpy\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m  \u001b[1;31m# pylint: disable=protected-access\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   1150\u001b[0m     \u001b[1;32mreturn\u001b[0m \u001b[0mmaybe_arr\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmaybe_arr\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32melse\u001b[0m \u001b[0mmaybe_arr\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1151\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32md:\\Users\\forla\\anaconda3\\envs\\tf2\\lib\\site-packages\\tensorflow\\python\\framework\\ops.py\u001b[0m in \u001b[0;36m_numpy\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m   1113\u001b[0m   \u001b[1;32mdef\u001b[0m \u001b[0m_numpy\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1114\u001b[0m     \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1115\u001b[1;33m       \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_numpy_internal\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   1116\u001b[0m     \u001b[1;32mexcept\u001b[0m \u001b[0mcore\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_NotOkStatusException\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[1;33m:\u001b[0m  \u001b[1;31m# pylint: disable=protected-access\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1117\u001b[0m       \u001b[1;32mraise\u001b[0m \u001b[0mcore\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_status_to_exception\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0me\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[1;32mNone\u001b[0m  \u001b[1;31m# pylint: disable=protected-access\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "estimator_lst = []\n",
    "from tensorflow.keras.callbacks import EarlyStopping\n",
    "for nlhs in nlhs_grid:\n",
    "    for k in k_grid:\n",
    "        X, dummy_y = getdata(k,nlhs)\n",
    "        epochs = 1000  # Increase max epochs\n",
    "        early_stopping = EarlyStopping(\n",
    "            monitor='val_loss',\n",
    "            patience=200,\n",
    "            restore_best_weights=True\n",
    "        )\n",
    "        \n",
    "        estimator_lst.append(KerasClassifier(\n",
    "            model=baseline_model, \n",
    "            epochs=epochs, \n",
    "            batch_size=10000, \n",
    "            verbose=0,\n",
    "            callbacks=[early_stopping],\n",
    "            validation_split=0.2  # Use 20% of training data for validation\n",
    "        ))\n",
    "        kfold = KFold(n_splits=5, shuffle=True)\n",
    "        for train_index, test_index in kfold.split(X):\n",
    "            X_train, X_test = X[train_index], X[test_index]\n",
    "            y_train, y_test = dummy_y[train_index], dummy_y[test_index]\n",
    "            \n",
    "            X_train = tf.convert_to_tensor(X_train)\n",
    "            y_train = tf.convert_to_tensor(y_train)\n",
    "            X_test = tf.convert_to_tensor(X_test)\n",
    "            y_test = tf.convert_to_tensor(y_test)    \n",
    "            \n",
    "            estimator_lst[-1].fit(X_train, y_train)\n",
    "            print(\"train-score: %.2f\" % (estimator_lst[-1].score(X_train, y_train)))\n",
    "            print(\"test-score: %.2f\" % (estimator_lst[-1].score(X_test, y_test))) \n",
    "        savemodel(estimator_lst[-1],k,nlhs)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "825304b4",
   "metadata": {},
   "outputs": [],
   "source": [
    "print(X_train.shape)\n",
    "print(y_train.shape)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
